#include "sdl_engine.h"

void sdl_engine::kill()
{
    _msg("engine", 40, "otrzymano polecenie zabicia się");
    active = false;
}

void sdl_engine::print()
{
    update_layers();

    for (std::list<sdl_ptr<sdl_layer> >::iterator i = layers.begin(); i != layers.end(); i++)
        std::cout << *(*i) << std::endl;
}

void sdl_engine::update_layers()
{
    for (std::list<sdl_ptr<sdl_layer> >::iterator i = sdl_layer::submitted_layers.begin(); i != sdl_layer::submitted_layers.end(); i++) {
        layers.push_back(*i);
        _msg("engine", 3, "włożyłem zadanie " << (*i)->name() << " do pętli");
    }

    sdl_layer::submitted_layers.clear();

    layers.sort();
}

sdl_engine::sdl_engine() :
sdl_prim("engine"),
active(true)
{
    /*
     * Inicjalizacja biblioteki SDL
     * SDL_Init w wypadku błędu zwraca -1
     */
    if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER) < 0) {
        _err("engine", "SDL init error: " << SDL_GetError);
    }

    update_layers();
}

sdl_engine::~sdl_engine()
{
    _msg("engine", 5, "kasowanie engine " << name());
    // czyszczenie listy zadań
    layers.clear();
    // sprzątanie biblioteki
    SDL_Quit();
}

void sdl_engine::run()
{
    while (true) {
        // aktualizujemy o nowe zadania
        update_layers();
        // i iterujemy przez listę zadań

        for (std::list<sdl_ptr<sdl_layer> >::iterator i = layers.begin(); i != layers.end(); i++) {
            if ((*i)) //czy to jest dobry wskaźnik?
                if (!(*i)->is_paused()) {
                    _msg("engine", 1, "uaktualnianie " << (*i)->name());
                    (*i)->update();
                }
        }

        if (!active) break;
    }
}

template<> sdl_ptr<sdl_engine> sdl_singleton<sdl_engine>::__field = NULL;
